<?php
/**
 * Created by Zhy
 * User: Zhy
 * Date: 2021/1/12
 * Time: 10:09
 */

namespace app\api\controller;

use think\Db;
include_once $_SERVER ['DOCUMENT_ROOT'] . '/upacp_demo_app/sdk/acp_service.php';


class Yinl extends Base
{
    // 定义配置项
    private $config=array(
        'merId'              => '777290058188484',
    
    );
    /**
     * 异地登录验证
     * @return string
     */
    public function __construct()
    {
        // 如果配置项为空 则直接返回
        if (!empty($config)) {
            $this->config=$config;
        }
    }
    
    /**
     * 统一下单
     * order_id    订单ID
     */
    public function UpacpPayTn(){
        $order_id = input('order_id');
        $result = Db::table('up_goods_order')
            ->where('order_id', $order_id)
            ->update(['order_pay_type' => 3, 'order_updatetime' => date('Y-m-d H:i:s')]);
        if($result){
            $order = Db::table('up_goods_order')
                ->where('order_id', $order_id)
                ->field('order_pay_price, order_number')
                ->find();
            $params = array(
                //以下信息非特殊情况不需要改动
                'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,                 //版本号
                'encoding' => 'utf-8',				  //编码方式
                'txnType' => '01',				      //交易类型
                'txnSubType' => '01',				  //交易子类
                'bizType' => '000201',				  //业务类型
                'frontUrl' =>  \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontUrl,  //前台通知地址
                'backUrl' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl,	  //后台通知地址
                'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,	              //签名方法
                'channelType' => '08',	              //渠道类型，07-PC，08-手机
                'accessType' => '0',		          //接入类型
                'currencyCode' => '156',	          //交易币种，境内商户固定156
        
                //TODO 以下信息需要填写
                'merId' => $this->config['merId'],		//商户代码，请改自己的测试商户号，此处默认取demo演示页面传递的参数
                'orderId' => $order['order_number'],	//商户订单号，8-32位数字字母，不能含“-”或“_”，此处默认取demo演示页面传递的参数，可以自行定制规则
                'txnTime' => date('YmdHis'),	//订单发送时间，格式为YYYYMMDDhhmmss，取北京时间，此处默认取demo演示页面传递的参数
//            'txnAmt' => $order['order_pay_price'] * 100,	//交易金额，单位分，此处默认取demo演示页面传递的参数
                'txnAmt' => 1,	//交易金额，单位分，此处默认取demo演示页面传递的参数
        
                // 请求方保留域，
                // 透传字段，查询、通知、对账文件中均会原样出现，如有需要请启用并修改自己希望透传的数据。
                // 出现部分特殊字符时可能影响解析，请按下面建议的方式填写：
                // 1. 如果能确定内容不会出现&={}[]"'等符号时，可以直接填写数据，建议的方法如下。
                //    'reqReserved' =>'透传信息1|透传信息2|透传信息3',
                // 2. 内容可能出现&={}[]"'符号时：
                // 1) 如果需要对账文件里能显示，可将字符替换成全角＆＝｛｝【】“‘字符（自己写代码，此处不演示）；
                // 2) 如果对账文件没有显示要求，可做一下base64（如下）。
                //    注意控制数据长度，实际传输的数据长度不能超过1024位。
                //    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
                //    'reqReserved' => base64_encode('任意格式的信息都可以'),
        
                //TODO 其他特殊用法请查看 pages/api_05_app/special_use_purchase.php
            );
            \com\unionpay\acp\sdk\AcpService::sign ( $params ); // 签名
            $url = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->appTransUrl;
            $result_arr = \com\unionpay\acp\sdk\AcpService::post ($params, $url);
            $res = ['url' => 'https://gateway.test.95516.com/gateway/api/appTransReq.do', 'res' => true]; // 测试
//            $res = ['url' => 'https://gateway.95516.com/gateway/api/appTransReq.do', 'res' => false]; // 正式
            if(count($result_arr) <= 0) { //没收到200应答的情况
                $res['msg'] = '无应答，请稍后再试';
                $res['status'] = 0;
            }
            if (!\com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
                $res['msg'] = '验签失败，请稍后再试';
                $res['status'] = 0;
            }
            if ($result_arr["respCode"] == "00"){
                //成功
                $res['msg'] = $result_arr['tn'];
                $res['status'] = 200;
            } else {
                //其他应答码做以失败处理
                $res['msg'] = $result_arr["respMsg"];
                $res['status'] = 0;
            }
            return json($res);
        }else{
            return json(['status' => 0, 'msg' => 'system error!']);
        }
    }
    
    /**
     * 验证
     * @return array 返回数组格式的notify数
     */
    public function huidiao(){
        if (isset ( $_POST ['signature'] )) {
            if(\com\unionpay\acp\sdk\AcpService::validate ( $_POST )){
                $orderId = $_POST ['orderId']; // 订单号
                $respCode = $_POST ['respCode'];
                if($respCode == '00'){
                    $queryId = $_POST ['queryId'];
    
                    $order = Db::table('up_goods_order')
                        ->where('order_number', $orderId)
                        ->field('order_id, order_num, order_goods_id, order_buy_user_id, order_sail_user_id, 
                    order_type, order_yue_id, order_spec_id, order_status')
                        ->find();
    
                    if($order['order_status'] == 1){
                        Db::startTrans();
                        try{
                            // 修改订单状态
                            Db::table('up_goods_order')
                                ->where('order_id', $order['order_id'])
                                ->update([
                                    'order_status' => 2,
                                    'order_pay_time' => date('Y-m-d H:i:s'),
                                    'order_pay_date' => date('Y-m-d'),
                                    'order_return_number' => $queryId
                                ]);
            
                            // 约稿订单
                            if($order['order_type'] == 4){
                                Db::table('up_yue')->where('yue_id', $order['order_yue_id'])->setField('yue_status', 2);
                            }
            
                            // 除了押金订单，其他的需要给画师发个信息
                            if($order['order_type'] != 5){
                                $notice = [
                                    'notice_title' => '您有一个订单已付款',
                                    'notice_content' => '您有一个订单已付款',
                                    'notice_user' => ',' . $order['order_sail_user_id'] . ',',
                                    'notice_type' => 5,
                                    'notice_order_id' => $order['order_id'],
                                    'notice_read_user' => ',0,',
                                    'notice_del_user' => ',0,',
                                    'notice_time' => date('Y-m-d H:i:s')
                                ];
                                Db::table('up_notice')->insert($notice);
                            }
            
                            Db::commit();
                            $result = true;
                        }catch(\Exception $e){
                            Db::rollback();//回滚
                            $result = false;
                        }
                    }else{
                        $result = true;
                    }
                    if($result == true){
                        echo 200;
                        exit();
                    }else{
                        echo 0;
                        exit();
                    }
                }
            }
        }
    }
}